package threading;

// 两把锁两个线程的死锁 模拟实现

public class Demo3 {
    public static void main(String[] args) {
        Object locker1 = new Object();
        Object locker2 = new Object();

        // 这两个线程都是获取到一把锁之后、释放之前尝试去获取另一把锁！
        // 注意：是锁的嵌套！不释放直接就直接再去获取
        // 如果是释放之后再获取是不会死锁的。

        // 线程t1
        // 锁的嵌套关系！！！
        Thread t1 = new Thread(() -> {
            System.out.println("t1尝试获取locker1");
            synchronized (locker1) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("t1尝试获取locker2");
                synchronized (locker2) {
                    System.out.println("t1获取两把锁成功！");
                }
            }
        });

        // 线程t2
        // 锁是嵌套关系
        Thread t2 = new Thread(() -> {
            System.out.println("t2尝试获取locker2");
            synchronized (locker2) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("t2尝试获取locker1");
                synchronized (locker1) {
                    System.out.println("t2获取两把锁成功！");
                }
            }
    });

        // 两个线程先加的是不同的对象锁，然后尝试获取对方的锁！！

        // 启动线程
        t1.start();
        t2.start();

        // 运行结果：只有尝试获取，没有成功获取两把锁，说明陷入了死锁！

        // 注意加锁顺序！！！
    }
}
